package redSocialUjaenDAO;

import excepciones.ErrorBusquedaUsuarioEmail;
import excepciones.ErrorCreacionUsuario;
import excepciones.ErrorActualizacionUsuario;
import java.util.Collection;
import javax.persistence.*;
import redsocialujaen_pa.Usuario;


/**
 *
 * @author carmen
 */
public class DAOUsuario {
    
    
    static DAOUsuario instancia = null;
     
    private DAOUsuario(){}
    
    public void crear(Usuario u) throws ErrorCreacionUsuario {
        EntityManager em = gestorPersistencia.instancia().getEntityManager();

        try {
            em.getTransaction().begin();
            em.persist(u);
            em.getTransaction().commit();
        }
        catch(EntityExistsException e) {
            if (em.getTransaction().isActive()) 
                em.getTransaction().rollback();
            throw new ErrorCreacionUsuario();
        }
    }
    
    public void actualizar(Usuario u) throws ErrorActualizacionUsuario {
        EntityManager em = gestorPersistencia.instancia().getEntityManager();

        try {
            em.getTransaction().begin();
            em.merge(u);
            em.getTransaction().commit();
        }
        catch(EntityExistsException e) {
            em.getTransaction().rollback();
            throw new ErrorActualizacionUsuario();
        }        
    }
   
    /**
     * Busqueda de usuarios por termino
     * @param termino: es el termino de busqueda
     * @return collection de usuarios
     */
    public Collection<Usuario> buscarUsuarioPorTermino(String termino) {
        Collection<Usuario> c = null;
        EntityManager em = gestorPersistencia.instancia().getEntityManager();
        
        Query usuarios = em.createQuery("SELECT u FROM Usuario u WHERE nombre LIKE :termino OR descripcion LIKE :termino"); 
        c = (Collection<Usuario>) usuarios.getResultList();
        
        return c;
       
    }
     
    /**
     * Busca un usuario por su clave (email) en la BD
     * @param email
     * @return 
     */
    public Usuario buscarUsuarioEmail(String email) throws ErrorBusquedaUsuarioEmail{
        EntityManager em = gestorPersistencia.instancia().getEntityManager();
        
        return  em.find(Usuario.class, email);
    }
    
    
    public static DAOUsuario instancia() {
        if (instancia == null) {
            instancia = new DAOUsuario();
        }
        
        return instancia;
    }
    
}
